SWFMacMouseWheelで気づいたこと
- 2008 年 4月 18 日
swfmacmousewheel2.jsを読んでみて気づいたこと。
swfmacmousewheel2.jsの中身を読んでみたのですが、以下のコメントのような動きだと思うのです。
//swfmacmousewheel2.jsを読み込むと同時にswfmacmousewheelが実行される
var swfmacmousewheel = function(){ if (!swfobject) return null; //swfobjectが無かったらnullを返す。処理停止 var u = navigator.userAgent.toLowerCase(); var p = navigator.platform.toLowerCase(); var d = p ? /mac/.test(p) : /mac/.test(u); if (!d) return null; //Macで無かったらnullを返す。処理停止 var k = []; //SWFの識別IDを格納する配列 //マウスホイールの移動量を返す var r = function(event){ var o = 0; if (event.wheelDelta) { //マウスホイールの移動量 o = event.wheelDelta / 120; if (window.opera) o = -o; //ブラウザ調整 } else if (event.detail) { o = -event.detail; } //ブラウザ調整 if (event.preventDefault) event.preventDefault(); //これをどうにかできれば... return o; }; //FLASHに移動量を渡す var l = function(event){ var o = r(event); var c; for (var i = 0; i < k.length; i++) { c = swfobject.getObjectById(k[i]); if (typeof(c.externalMouseEvent) == 'function') c.externalMouseEvent(o); } }; //マウスホイールのイベント定義 if (window.addEventListener) window.addEventListener('DOMMouseScroll', l, false); window.onmousewheel = document.onmousewheel = l; //メソッド設定 return { registerObject: function(m){ //SWFの識別IDを配列に格納 k[k.length] = m; } }; }(); |
気になったのは、
event.preventDefault();
でして、preventDefault()を調べてみると、
イベントがキャンセル可能な場合、preventDefault メソッドを使用すると イベントのキャンセルを通知できるため、そのイベントの結果として通常は実装により 実行されるデフォルトのアクションが実行されません。
とあります。ここでキャンセルされるのはマウスホイールの動作なのでフォーカスが外れない問題はここにあるように思います。
試しに消してみたらブラウザのスクロールバーが動きました。
が、Flashへのマウスホイールと同時にブラウザのスクロールバーが動いてしまうので消すだけでも駄目なわけです。
たぶんですが、FlashとJavaScriptでフォーカスやカーソルの位置を調べて、preventDefault();を制御すれば回避できるのかも?と思いました。